#pragma once

#include"noncopyable.h"
#include"Timestamp.h"

#include<vector>
#include<unordered_map>

class Channel;
class EventLoop;
//muduo 中多路事件分发器的核心IO复用模块
//Poller类存在的原因是，muduo没有直接使用epoll，而是提供了epoll和poll两种方式，因此使用poller作为抽象层
class Poller:noncopyable
{
public:
    using ChannelList = std::vector<Channel*>;
    
    Poller(EventLoop* Loop);
    virtual ~Poller() = default;

    //给所有IO复用保留统一接口
    virtual Timestamp poll(int timeoutMs, ChannelList * activeChannels) = 0;
    virtual void updateChannel(Channel* channel) = 0;
    virtual void removeChannel(Channel* Channel) = 0;

    //判断参数channel是否在当前Poller中
    bool hasChannel(Channel* channel) const;

    //为何不在本类中实现，但如果需要返回具体类型，就必须包含子类的头文件，这个设计不合理
    //EventLoop可以通过该接口获取默认的IO复用的具体实现
    static Poller* newDefaultPoller(EventLoop *Loop);
protected:
    //在保护层可以让子类继承
    //int -》socketfd
    using ChannelMap = std::unordered_map<int, Channel*> ;
    ChannelMap channels_;
private:
    EventLoop* ownerLoop_;

};